package com.sakura.system.service.impl.xyimpl;

import com.sakura.system.dao.xydao.RecordMapper;
import com.sakura.system.entity.xy.Record;
import com.sakura.system.entity.xy.Schart1Data;
import com.sakura.system.utils.DateManageSystem;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class RecordServiceImpl implements RecordService {
    @Resource
    RecordMapper recordMapper;

    /**
     * 根据成员ID选择记录
     *
     * @param memberId 成员的唯一标识符
     * @return 返回与指定成员ID相关的记录列表
     */
    @Override
    public List<Record> selectRecordByMemberId(String memberId) {
        // 通过成员ID查询记录
        return recordMapper.selectRecordByMemberId(memberId);
    }

    /**
     * 根据卡号删除记录
     *
     * @param cardId 卡号，用于指定需要删除的记录
     * @return 无返回值
     */
    @Override
    public void deleteRecordByCardId(String cardId) {
        // 调用recordMapper删除指定卡号的记录
        recordMapper.deleteRecordByCardId(cardId);
    }


    /**
     * 插入一条记录到数据库。
     * @param record 需要插入的记录对象，不应为null。
     */
    @Override
    public void insertRecord(Record record) {
        // 调用recordMapper的insertRecord方法，插入记录
        recordMapper.insertRecord(record);
    }


    /**
     * 获取电影数量
     *
     * 本方法通过调用recordMapper的selectMovieCount方法，查询数据库中电影的数量。
     * 不接受任何参数。
     *
     * @return 返回电影数量的Long类型值。
     */
    @Override
    public Long getMovieNum() {
        // 查询数据库中电影的数量
        return recordMapper.selectMovieCount();
    }

    /**
     * 获取消费计数。
     *
     * 本方法通过调用recordMapper的selectConsumeCount方法，来查询并返回当前的消费计数。
     *
     * @return 返回消费计数的Long类型值。
     */
    @Override
    public Long getConsumeCount() {
        // 查询并返回消费计数
        return recordMapper.selectConsumeCount();
    }

        /**
     * 获取积分兑换次数的总数。
     *
     * @return 返回积分兑换次数的总和，返回类型为Long。
     */
    @Override
    public Long getIntegralExchangeCount() {
        // 调用recordMapper的selectIntegralExchangeCount方法，查询积分兑换的总数
        return recordMapper.selectIntegralExchangeCount();
    }


    /**
 * 获取充值次数的总数。
 *
 * 本方法不需要参数，通过调用recordMapper的selectRechargeCount方法，
 * 从数据库中查询并返回所有充值记录的总数。
 *
 * @return Long 充值次数的总数。
 */
@Override
public Long getRechargeCount() {
    // 从数据库查询并返回充值记录总数
    return recordMapper.selectRechargeCount();
}


    /**
     * 获取上周一到周五的消费、充值和积分兑换数据
     * 该方法不接受任何参数，返回一个包含上周每天的消费、充值和积分兑换数据的对象。
     *
     * @return Schart1Data 包含上周每天的消费、充值和积分兑换数据的对象。
     */
    @Override
    public Schart1Data getSchart1Data() {
        Schart1Data schart1Data = new Schart1Data();
        Integer[] consume = new Integer[5]; // 消费数据数组
        Integer[] recharge = new Integer[5]; // 充值数据数组
        Integer[] integral = new Integer[5]; // 积分兑换数据数组

        // 获取上一个周的周一到周五的日期
        DateManageSystem dateManageSystem = new DateManageSystem();
        String[] DateLimit = dateManageSystem.getLastWeek();

        // 循环上一个周一到周五，查询在当日0点到24点之间交易的记录，并计算相对应的数据之和
        for(int i = 0;i<5;i++){
            String startDate = DateLimit[i];
            String endDate = DateLimit[i+1];
            // 查询并计算消费数据
            consume[i] = recordMapper.selectConsumeCountByDate(startDate,endDate)==null?0:recordMapper.selectConsumeCountByDate(startDate,endDate);
            consume[i]*=-1; // 消费数据取负值
            // 查询并计算充值数据
            recharge[i] = recordMapper.selectrechargeCountByDate(startDate,endDate)==null?0:recordMapper.selectrechargeCountByDate(startDate,endDate);
            // 查询并计算积分兑换数据
            integral[i] = recordMapper.selectintegralCountByDate(startDate,endDate)==null?0:recordMapper.selectintegralCountByDate(startDate,endDate);
            integral[i]*=-1; // 积分兑换数据取负值
        }
        // 将统计数据存入Schart1Data对象中
        schart1Data.setConsume(consume);
        schart1Data.setRecharge(recharge);
        schart1Data.setIntegral(integral);
        return schart1Data;
    }
}
